#include <stdio.h>
#include <string.h>

// 定义学生结构体
struct Student
{
  char name[20];
  int age;
};

// 1. 值传递：接收结构体副本
void modifyByValue(struct Student s)
{
  strcpy(s.name, "李四"); // 修改副本的姓名
  s.age = 20;             // 修改副本的年龄
  printf("值传递函数内：姓名=%s, 年龄=%d\n", s.name, s.age);
}

// 2. 地址传递：接收结构体指针
void modifyByAddress(struct Student *s)
{
  strcpy(s->name, "李四"); // 通过指针访问并修改原结构体
  s->age = 20;             // 通过->访问并修改原结构体
  printf("地址传递函数内：姓名=%s, 年龄=%d\n", s->name, s->age);
}

int main()
{
  struct Student stu = {"张三", 18};

  // 测试值传递
  printf("值传递前：姓名=%s, 年龄=%d\n", stu.name, stu.age);
  modifyByValue(stu);
  printf("值传递后：姓名=%s, 年龄=%d\n\n", stu.name, stu.age); // 原结构体未变

  // 测试地址传递
  printf("地址传递前：姓名=%s, 年龄=%d\n", stu.name, stu.age);
  modifyByAddress(&stu);
  printf("地址传递后：姓名=%s, 年龄=%d\n", stu.name, stu.age); // 原结构体已修改

  return 0;
}
